package ssm.Test.JavaMain;

import org.apache.ibatis.session.SqlSession;
import ssm.Dao.MerchUserOrder;
import ssm.Pojo.YzMerchUserOrder;
import ssm.Test.JavaMain.entity.Employee;
import ssm.Test.JavaMain.mapper.EmployeeMapper;

/**
 * @Author Maple.Chen
 * @Description  普通测试类
 * @Date 15:11 2020/4/24
 **/
public class Test {
    public static void main(String[] args){
        SqlSession sql = MybatisUtil.getSqlSession();
        // 分步查询
//        stepQuery(sql);

        // MD5加密
//        System.out.println(EncryptUtil.getMD5String("123456"));

        // 鉴别器
//        findEmployeeById(sql);

        // 一级缓存与二级缓存
//        FirstLevelCache(sql);
        SecondaryCache();
    }

    private static void FirstLevelCache(SqlSession session) {
        /*
        mybatis就会先从缓存区拿取之前的数据（一个HashMap结构），没有再查数据库
        下边我们虽然查了两次，但是我们查询的语句或者statementId都是相同的(因为ibatis默认先查缓存区)
        1.每个SqlSession都有一个独立的一级缓存区，这是默认存在的，我们不能配置它
        2.当没有执行session.close方法之前：你执行insert、delete、update或者clearCache()操作，一级缓存就会清空，但是SqlSession
            仍可以正常使用
         */
        EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
        Employee employee1 = mapper.findEmployeeById(1);
        Employee employee2 = mapper.findEmployeeById(1);
        System.out.println("没清除一级缓存，我们取同一个对象，两者比较=" + (employee1 == employee2) ); // true  ：同一个一级缓存SqlSession对象
        session.clearCache();  // 如果你执行这个方法，就算查询条件相同，那么第二次查询就会从数据库拿数据，因为缓存这个Hash<K,V>已经不存在了,下面的结果就是false
        Employee employee3 = mapper.findEmployeeById(1);
        System.out.println("清除一级缓存，我们再取一个对象，两者比较=" + (employee1 == employee3) ); // false
        session.close();
        System.out.println("----------------------------------------------------------------------------");
    }

    /*
    分段查询
     */
    public static void stepQuery(SqlSession session){
        MerchUserOrder md = session.getMapper(MerchUserOrder.class);
        YzMerchUserOrder o = md.findOrderById("1");
        // 由于设置了延迟加载 <setting name="lazyLoadingEnabled" value="true"/>
//        System.out.println(o.toString());  // 这样会加载全部对象，即Order和Order关联的对象,和不配置延迟加载没区别
            //你的主表肯定会查，关联表是按需加载
//        System.out.println(o.getTotalPrice());  // 只会加载Order
        System.out.println(o.getYzMerch()); // 只会加载Order和merch对象
        session.close();

    }

    public static void findEmployeeById(SqlSession session){
        // 注意mybatis数据源的设置，从development变成了test源配置
        /*
        建表语句  <employee_type A薪水工，B钟点工>
        create table employee(id int(6) primary key,name varchar(255),employee_type varchar(10),rate double,salary double);
         */
        EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
        // 除了增删改需要提交事务，查是不需要提交事务的
        Employee employee1 = mapper.findEmployeeById(1);
        Employee employee2 = mapper.findEmployeeById(2);
        System.out.println("employee1 instance of \"" + employee1.getClass() + "\"");
        System.out.println("employee2 instance of \"" + employee2.getClass() + "\"");
        session.close();
    }

    public static void SecondaryCache(){
        SqlSession session1;
        SqlSession session2;
        /*
        二级缓存：
            1.先在mapper.xml加上<cache  type="org.mybatis.caches.ehcache.LoggingEhcache"/>
            2.添加ehcache.xml配置文件
            3.pom.xml导入jar包

            ！！！自带的cache在mapper.xml加上<cache/>即可，实体类序列化implements Serializable
         */
        session1 = MybatisUtil.getSqlSession();
        EmployeeMapper mapper1 = session1.getMapper(EmployeeMapper.class);
        Employee employee_1 = mapper1.findEmployeeById(1);
        /*
        2020.04.27 17:42 记录：不知为啥我得手动commit写入缓存
        mapper.xml使用自带的二级缓存 <cache />
        mapper.xml使用第三方二级缓存 <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
         */
        // 当前设为自带二级缓存，适用于无关联表的情况下，否则可能会导致脏数据的产生
        session1.commit();
        // 第二次不会查询数据库，而是去二级缓存里拿
        session2 = MybatisUtil.getSqlSession();
        EmployeeMapper mapper2 = session2.getMapper(EmployeeMapper.class);
        Employee employee_2 = mapper2.findEmployeeById(1);
        //sentence
        System.out.println(employee_1 == employee_2);
        session1.close();
        session2.close();
    }
}
